home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_80 / cdplay.pas < prev    next >
Pascal/Delphi Source File  |  1995-01-01  |  5KB  |  231 lines

  1. unit CDPlay;
  2. {
  3.   Copyright (c) June 1993, by Charlie Calvert
  4.   Feel free to use this code as an adjunct to your own programs.
  5.  
  6.   This unit is the object oriented interface
  7.   to the DLLs that control a CD player.
  8. }
  9. interface
  10. uses
  11.   CDUnit,
  12.   MmSystem,
  13.   ODialogs,
  14.   OWindows,
  15.   PlayDlg,
  16.   PlayerId,
  17.   Strings,
  18.   WinProcs,
  19.   WinTypes;
  20.  
  21. const
  22.   ID_CURTRACK = 126;
  23.   ID_CURTIME = 127;
  24.  
  25. type
  26.   PCDDialog = ^TCDDialog;
  27.   TCDDialog = Object(TPlayDialog)
  28.       NumTracks: LongInt;
  29.     constructor Init(AParent: PWindowsObject; AName: PChar);
  30.     destructor Done; virtual;
  31.     procedure SetUpWindow; virtual;
  32.     procedure GetInfoFiles;
  33.     procedure ReportStatus; virtual;
  34.     procedure SelectSongs(var Msg: TMessage);
  35.       virtual id_First + id_CdTrackList;
  36.     procedure DeSelectSongs(var Msg: TMessage);
  37.       virtual id_First + id_CdPlayList;
  38.     procedure Abort(var Msg: TMessage);
  39.       virtual id_First + idAbort;
  40.     procedure BeginPlay(var Msg: TMessage);
  41.       virtual id_First + ID_CDPlay;
  42.     procedure MciNotify(var Msg: TMessage);
  43.       virtual wm_First + mm_MciNotify;
  44.     procedure WMTimer(var Msg: TMessage);
  45.       virtual wm_First + wm_Timer;
  46.   end;
  47.  
  48. implementation
  49. {--------------------------------------------------}
  50. { TCDPlayer's method implementations:              }
  51. {--------------------------------------------------}
  52. constructor TCDDialog.Init(AParent: PWindowsObject; AName: PChar);
  53. begin
  54.   inherited Init(AParent, AName);
  55. end;
  56.  
  57. destructor TCDDialog.Done;
  58. begin
  59.   if GetDeviceID > 0 then begin
  60.     StopMCI;
  61.     CloseMci;
  62.   end;
  63.   inherited Done;
  64. end;
  65.  
  66. procedure FillTrackBox(HWindow: HWnd; NumTracks: LongInt; S: PChar);
  67.  
  68. type
  69.   TInfo = Record
  70.     Track, Min, Sec, Frame: Word;
  71.   end;
  72.  
  73. var
  74.   Info: TInfo;
  75.   i: Integer;
  76.   Min,Sec,Frame: Byte;
  77.  
  78. begin
  79.   for i := 1 to NumTracks do begin
  80.     GetTrackLength(i, Min, Sec, Frame);
  81.     Info.Track := i;
  82.     Info.Min := Min;
  83.     Info.Sec := Sec;
  84.     Info.Frame := Frame;
  85.     WvsPrintF(S, 'Track: %d  >> Time: %d:%d', Info);
  86.     SendDlgItemMessage(HWindow, ID_CDTrackList, lb_AddString, 0, LongInt(S));
  87.   end;
  88. end;
  89.  
  90. procedure TCDDialog.SetUpWindow;
  91. begin
  92.   inherited SetUpWindow;
  93.   if not OpenCD(hWindow) then exit;
  94.   while not HasDiskInserted do
  95.     MessageBox(HWindow, 'Insert Disk', 'Foo', mb_Ok);
  96.   GetInfoFiles;
  97. end;
  98.  
  99. procedure TCDDialog.ReportStatus;
  100. type
  101.   TTimeAry = Array[0..1] of Word;
  102.  
  103. var
  104.   S: PChar;
  105.   Track: LongInt;
  106.   Time: LongInt;
  107.   TimeAry: TTimeAry;
  108.  
  109. begin
  110.   GetMem(S, 100);
  111.   Mode := GetMode;
  112.   GetStatus;
  113.   Track := GetCurrentCDTrack;
  114.   WvsPrintF(S, '%ld', Track);
  115.   SendDlgItemMessage(hWindow, ID_CURTRACK, WM_SETTEXT, 0, LongInt(S));
  116.   Time := GetLocation;
  117.   TimeAry[1] := MCI_TMSF_SECOND(Time);
  118.   TimeAry[0] := MCI_TMSF_MINUTE(Time);
  119.   WvsPrintF(S, '%d:%d', TimeAry);
  120.   SendDlgItemMessage(hWindow, ID_CURTIME, WM_SETTEXT, 0, LongInt(S));
  121.   FreeMem(S, 100);
  122. end;
  123.  
  124. procedure TCdDialog.SelectSongs(var Msg: TMessage);
  125. var
  126.   S: array[0..200] of Char;
  127.   Sel: LongInt;
  128. begin
  129.   case Msg.lParamHi of
  130.     lbn_DblClk: begin
  131.       Sel := SendDlgItemMessage(HWindow, ID_CDTrackList, lb_GetCurSel, 0, 0);
  132.       if Sel <> lb_Err then begin
  133.         SendDlgItemMessage(HWindow, ID_CDTrackList, lb_GetText, Sel, LongInt(@S));
  134.         SendDlgItemMessage(HWindow, ID_CDPlayList, lb_AddString, Sel, LongInt(@S));
  135.       end;
  136.     end;
  137.   end;
  138. end;
  139.  
  140. procedure TCdDialog.DeSelectSongs(var Msg: TMessage);
  141. var
  142.   Sel: LongInt;
  143. begin
  144.   case Msg.lParamHi of
  145.     lbn_DblClk: begin
  146.       Sel := SendDlgItemMessage(HWindow, ID_CDPlayList, lb_GetCurSel, 0, 0);
  147.       if Sel <> lb_Err then
  148.         SendDlgItemMessage(HWindow, ID_CDPlayList, lb_DeleteString, Sel, 0);
  149.     end;
  150.   end;
  151. end;
  152.  
  153. procedure TCdDialog.GetInfoFiles;
  154. const
  155.   Max = 50;
  156.  
  157. var
  158.   S: PChar;
  159.  
  160. begin
  161. {  SetMSFasFormat; }
  162.   SetTMSFasFormat;
  163.   NumTracks := GetNumTracks;
  164.   GetMem(S, Max);
  165.   wvsPrintF(S, '%d', NumTracks);
  166.   SendDlgItemMessage(HWindow, ID_CDNumTracks, Em_LimitText, Max, 0);
  167.   SendDlgItemMessage(HWindow, ID_CDNumTracks, Wm_SetText, 0, LongInt(S));
  168.   FreeMem(S, Max);
  169.   FillTrackBox(HWindow, NumTracks, S);
  170. end;
  171.  
  172. procedure TCDDialog.Abort(var Msg: TMessage);
  173. begin
  174.   StopMci;
  175.   ReportStatus;
  176. end;
  177.  
  178. function Parse(S: PChar): Byte;
  179. var
  180.   S1: PChar;
  181.   S2: array[0..50] of Char;
  182.   i,j: Integer;
  183. begin
  184.   S1 := StrPos(S,':');
  185.   i := 1;
  186.   j := 0;
  187.   while S1[i] <> '>' do begin
  188.     if S1[i] <> ' ' then begin
  189.       S2[j] := S1[i];
  190.       inc(j);
  191.     end;
  192.     inc(i);
  193.   end;
  194.   S2[j] := #0;
  195.   Val(S2, i, j);
  196.   Parse := i;
  197. end;
  198.  
  199. procedure TCDDialog.BeginPlay(var Msg: TMessage);
  200. var
  201.   S: array[0..200] of Char;
  202.   Start: Byte;
  203. begin
  204.   if (SendDlgItemMessage(HWindow, ID_CDPlayList,
  205.                          lb_GetText, 0, LongInt(@S)) = lb_Err) then begin
  206.     MessageBox(HWindow, 'You must select a track first' , 'Info', Mb_Ok);
  207.     Exit;
  208.   end;
  209.   Start := Parse(S);
  210.   StartTimer;
  211.   if Start <> NumTracks then
  212.     PlayMciCD(Start, Start + 1)
  213.   else
  214.     PlayCDOneTrack(Start);
  215. {  SetMSFasFormat; }
  216.   ReportStatus;
  217. end;
  218.  
  219. procedure TCDDialog.MciNotify(var Msg: TMessage);
  220. begin
  221.   {  KillTimer(HWindow, PlayTimer); }
  222.   ReportStatus;
  223.   if Mode = Mci_Mode_Stop then CloseMci;
  224. end;
  225.  
  226. procedure TCDDialog.WMTimer(var Msg: TMessage);
  227. begin
  228.   ReportStatus;
  229. end;
  230.  
  231. end.